package com.yunfei.utils;
import java.io.UnsupportedEncodingException;
import java.nio.charset.StandardCharsets;
import java.util.Base64;

/**
 * 该token工具类主要用户根据用户userId生成对应额token，并反向根据token解析出userId
 * 该工具类提供token生成策略
 * 根据token获取用户userId
 * @author zhengyunfei
 *
 */
public class TokenUtil {
    /*
     *单例设计模式（保证类的对象在内存中只有一个）
     *1、把类的构造函数私有
     *2、自己创建一个类的对象
     *3、对外提供一个公共的方法，返回类的对象
     */
    private TokenUtil(){
    }
    private static final String TOKEN_FENGEFU ="&&";//token分隔符
    private static final TokenUtil instance = new TokenUtil();

    /**
     * 返回类的对象
     * @return
     */
    public static TokenUtil getInstance(){
        return instance;
    }
    /**
     * 根据用户userId生成token
     * token生成规则:最近登录时间戳16位+userId+随机数9位
     * @return
     */
    public  String getToken(String userId,long lastLoginTime){
        SnowflakeIdWorker idWorker = new SnowflakeIdWorker(0, 0);
        //String token = lastLoginTime+userId+ idWorker.nextId();
        String token = lastLoginTime+userId;
        final Base64.Encoder encoder = Base64.getEncoder();
        final byte[] textByte = token.getBytes(StandardCharsets.UTF_8);
        final String encodedText = encoder.encodeToString(textByte);
        return encodedText;
    }
    public  String getToken(String userId,String lastLoginTime){
        SnowflakeIdWorker idWorker = new SnowflakeIdWorker(0, 0);
        String token = lastLoginTime+TOKEN_FENGEFU+userId;
        final Base64.Encoder encoder = Base64.getEncoder();
        final byte[] textByte = token.getBytes(StandardCharsets.UTF_8);
        final String encodedText = encoder.encodeToString(textByte);
        return encodedText;
    }
    /**
     * 将token解码
     * @throws UnsupportedEncodingException
     */
    public String getTokenStr(String token){
        final Base64.Decoder decoder = Base64.getDecoder();
        final String encodedText = new String(decoder.decode(token), StandardCharsets.UTF_8);
        return encodedText.replaceAll("null","");
    }

    /**
     * 解码后的token格式为：
     * 13位最近登录时间+userId+18位随机数
     * userId 为32位
     * @param token
     * @return
     */
    public String getUserId(String token){
        try {
           String tokenStr=getTokenStr(token);
            //返回userId
            String userId="";
            String tokenStrArray[]=tokenStr.split(TOKEN_FENGEFU);
            if(tokenStrArray.length>=2){
                 userId=tokenStr.split(TOKEN_FENGEFU)[1];
            }

            return userId;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    public static void main(String args[]) throws UnsupportedEncodingException {

      String token="MjAxOTAyMTUwNzExNTYzMDQmJjAxMDAxNDI=";
      String toke2="MjAxOTAyMTUwNjI3MzQ4MDAwMTAwMTQy";
      System.out.println("token==========="+token);
      System.out.println("uid====="+getInstance().getUserId(token));
      String id="20190215061432420100142";
      System.out.println(id.substring(16));



    }
}